SQL 인덱스 관리
IT 위키
SQL 인덱스 관리(SQL Index Management, 索引管理)은 관계형 데이터베이스에서 인덱스를 생성, 유지, 최적화하여 질의 성능을 향상시키는 작업을 의미한다.
1 개요[편집 | 원본 편집]
인덱스는 데이터베이스 테이블에서 특정 컬럼의 값을 기반으로 검색 속도를 향상시키기 위한 자료 구조이다. 인덱스를 적절히 관리하면 데이터 검색 시간이 대폭 단축되며, 부적절한 인덱스는 오히려 성능 저하의 원인이 될 수 있다.
2 인덱스의 종류[편집 | 원본 편집]
- 기본 인덱스(Primary Index)
- 보조 인덱스(Secondary Index)
- 고유 인덱스(Unique Index)
- 복합 인덱스(Composite Index)
- 함수 기반 인덱스(Function-based Index)
- 비트맵 인덱스(Bitmap Index)
3 인덱스 생성[편집 | 원본 편집]
인덱스는 일반적으로 CREATE INDEX 문을 사용하여 생성하며, 다음과 같은 방식으로 정의할 수 있다.
CREATE INDEX idx_employee_name ON employees(name);
복합 인덱스는 다음과 같이 생성할 수 있다.
CREATE INDEX idx_employee_dept_salary ON employees(department_id, salary);
고유 인덱스는 중복값을 허용하지 않는 인덱스로 다음과 같이 생성한다.
CREATE UNIQUE INDEX idx_employee_email ON employees(email);
4 인덱스 관리 전략[편집 | 원본 편집]
- 사용률 분석: 잘 사용되지 않는 인덱스는 제거하여 저장 공간을 절약하고 DML 성능을 향상시킨다.
- 정기적 재구성(Rebuild): 데이터 변경이 많을 경우 인덱스의 조각화(fragmentation)를 줄이기 위해 재구성이 필요하다.
- 통계 정보 갱신: 옵티마이저가 최적의 실행 계획을 수립할 수 있도록 주기적으로 인덱스 통계 정보를 갱신한다.
- 자동 인덱스 관리: 일부 DBMS는 자동으로 인덱스를 생성·제거하는 기능을 제공한다(예: Oracle의 Automatic Indexing).
- 인덱스 조건 최적화: WHERE 절과 자주 결합되는 컬럼 중심으로 인덱스를 구성한다.
5 인덱스 사용 모니터링[편집 | 원본 편집]
- 실행 계획(EXPLAIN 또는 EXPLAIN PLAN)을 통해 쿼리가 인덱스를 사용하는지 확인 가능
예: EXPLAIN SELECT * FROM employees WHERE name = '김철수';
- 쿼리 성능 도구(SQL Server Profiler, Oracle AWR 등)로 인덱스 활용도 측정
- DMVs(Dynamic Management Views)나 시스템 뷰를 통해 인덱스 통계 확인
예: SELECT * FROM sys.dm_db_index_usage_stats WHERE object_id = OBJECT_ID('employees');
6 인덱스 제거[편집 | 원본 편집]
불필요한 인덱스는 DROP INDEX 문을 사용하여 제거할 수 있으며, 다음과 같은 경우 인덱스를 제거한다.
- 조회 빈도가 낮고 DML 작업이 많은 경우
- 다른 인덱스와 기능이 중복되는 경우
- 성능 모니터링 결과 비용만 증가시키는 경우
예: DROP INDEX idx_employee_name ON employees;
7 인덱스가 사용되는 쿼리 예시[편집 | 원본 편집]
- 단일 컬럼 인덱스를 활용한 예
SELECT * FROM employees WHERE name = '홍길동';
- 복합 인덱스를 활용한 예
SELECT * FROM employees WHERE department_id = 10 AND salary > 5000;
- LIKE 연산에 대한 인덱스 사용 (전방 일치의 경우에만)
SELECT * FROM employees WHERE name LIKE '김%';
- 함수 기반 인덱스가 필요한 예
SELECT * FROM employees WHERE UPPER(name) = '홍길동'; -- 위 쿼리는 일반 인덱스를 사용하지 못하므로, 다음과 같이 인덱스를 생성해야 한다. CREATE INDEX idx_upper_name ON employees(UPPER(name));
8 주의사항[편집 | 원본 편집]
- 너무 많은 인덱스는 삽입, 갱신, 삭제 시 부하를 증가시킨다.
- 넓은 범위를 조회하는 쿼리에는 인덱스 효율이 낮을 수 있다.
- 함수나 연산이 적용된 컬럼에는 일반 인덱스가 작동하지 않을 수 있다.
9 같이 보기[편집 | 원본 편집]
10 참고 문헌[편집 | 원본 편집]
- Surajit Chaudhuri and Gerhard Weikum, "Rethinking Database System Architecture: Towards a Self-tuning RISC-style Database System", VLDB, 2000.
- Thomas Connolly and Carolyn Begg, *Database Systems: A Practical Approach to Design, Implementation, and Management*, Pearson.